package org.xx.sipahi;

import org.apache.commons.vfs2.FileObject;
import org.apache.commons.vfs2.FileSystemException;
import org.apache.commons.vfs2.NameScope;

import java.io.IOException;

import static org.apache.commons.lang3.StringUtils.equalsIgnoreCase;
import static org.apache.commons.lang3.StringUtils.trimToEmpty;

public final class FileManagerUtils {
    public static final String ROOT = "/";

    private FileManagerUtils() {
    }


    public static boolean isRootPath(
            String path
    ) {
        return path.equals(ROOT) || path.equals(ROOT + ".");
    }

    /**
     * 根据相对路径获取文件对象。
     *
     * @param path
     *         相对路径。
     * @return 解析结果。
     * @throws NullPointerException
     *         如果参数{@code path}是{@code null}。
     * @throws FileSystemException
     *         如果解析路径出现错误。
     */
    public static FileObject resolve(
            FileObject rootFileObject,
            String path
    )
            throws FileSystemException {
        if (isRootPath(path)) {
            return rootFileObject;
        }

        // 首先将路径参数转化为相对于根路径的相对路径。
        if (path.startsWith(ROOT)) {
            path = path.substring(ROOT.length());
        }

        // 然后通过根路径解析为对应的文件对象。
        return rootFileObject.resolveFile(path, NameScope.DESCENDENT_OR_SELF);
    }

    /**
     * 获取文件对象的相对路径。
     *
     * @param fileObject
     *         文件对象。
     * @return 此文件对象的相对路径。
     * @throws NullPointerException
     *         如果参数{@code fileObject}是{@code null}。
     * @throws IOException
     *         如果解析路径出现错误。
     */
    public static String relativize(
            FileObject rootFileObject,
            FileObject fileObject
    )
            throws IOException {
        final var result = rootFileObject.getName().getRelativeName(fileObject.getName());
        return !result.isEmpty() ? ROOT + result : ROOT;
    }

    /**
     * 判断文件对象是否是正常可显示的文件。
     *
     * @param fileObject
     *         需判断的文件对象。
     * @return 是否是正常可显示的文件。如果参数{@code fileObject}是{@code null}则返回{@code false}。
     */
    public static boolean isNormal(
            FileObject fileObject
    ) {
        if (fileObject == null) {
            return false;
        } else {
            try {
                return fileObject.exists() && !fileObject.isHidden() && !equalsIgnoreCase(fileObject.getName().getBaseName(), "WEB-INF");
            } catch (FileSystemException ignored) {
                return false;
            }
        }
    }

    /**
     * 检查路径参数是否合法。
     *
     * <p>路径不能为空，应当以斜线开头</p>
     *
     * @param path
     *         待检查的路径，自动去掉首尾空格。
     * @return 检查通过的路径参数。
     * @throws IllegalArgumentException
     *         如果路径参数不合法。
     */
    public static String checkPath(
            String path
    ) {
        path = trimToEmpty(path);
        if (!path.startsWith(ROOT)) {
            throw new IllegalArgumentException("Illegal path: " + path);
        }
        return path;
    }
}
